package com.java.Collection.Set;

import java.util.Arrays;
import java.util.Comparator;
import java.util.TreeSet;

/**
 * TreeSet排序
 */
public class TreeSetSort {
    static class Inner implements Comparable<Inner> {
        private int num;

        public Inner(int num) {
            this.num = num;
        }

        @Override
        public int compareTo(Inner o) {
            // this表示被添加的元素，返回负数时被添加元素放左侧，但返回负数也意味着被添加元素更小，所以是升序排序
            return this.num - o.num;

            // 升序：this - 参数
            // 降序：参数 - this
        }

        @Override
        public String toString() {
            return String.valueOf(num);
        }
    }

    public static void main(String[] args) {
        // 默认规则排序
        TreeSet<Integer> treeSet1 = new TreeSet<>(Arrays.asList(2, 2, 3, 1, 4));
        System.out.println(treeSet1); // [1, 2, 3, 4]

        // Comparable规则排序
        TreeSet<Inner> treeSet2 = new TreeSet<>(Arrays.asList(new Inner(2), new Inner(2), new Inner(3), new Inner(1), new Inner(4)));
        System.out.println(treeSet2); // [1, 2, 3, 4]

        // Comparator规则排序
        TreeSet<Integer> treeSet3 = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // 参数1表示被添加的元素，返回负数时被添加元素放左侧，但返回负数也意味着被添加元素更大，所以是降序排序
                return o2 - o1;

                // 升序：参数1 - 参数2
                // 降序：参数2 - 参数1
            }
        });
        treeSet3.addAll(Arrays.asList(2, 2, 3, 1, 4));
        System.out.println(treeSet3); // [4, 3, 2, 1]
    }
}
